//
// Created by zyl on 2021/5/5.
//
#include "m_c_realloc.h"
#include "stdlib.h"
#include "stdio.h"
/**
 * 从堆中分配一个int的大小内存
 *
 */
void malloc_z(void) {
    int *pInt = (int *) malloc(sizeof(int));
    if (pInt == NULL) {
        printf("\n分配内存失败");
        return;
    }
    printf("\n刚刚分配的地址不确定值:%u", *pInt);
    memset(pInt, 2, sizeof(int));
    printf("\n使用memset分配值后:%u", *pInt);
    *pInt = 4;
    printf("\n分配的放入的值为:%d", *pInt);
    //回收内存
    free(pInt);
}
/**
 * 从堆中申请一个数组，数组的大小由用户决定
 */
void malloc_array(void) {
    int n = 0;
    int *arr = NULL;
    //1. 从键盘获取用户要申请的数组大小
    printf("\n请输入元素的个数:");
    scanf("%d", &n);
    //2. 根据大小 从堆申请空间
    arr = (int *) malloc(sizeof(int) * n);
    if (arr == NULL) {
        printf("\n内存分配失败");
        return;
    }
    //3. 对空间进行读写操作
    for (int i = 0; i < n; ++i) {
        scanf("%d", arr + i);
    }
    for (int j = 0; j < n; ++j) {
        printf("%d", arr[j]);
    }
    //4. 释放该内存
    free(arr);
}
/**
 * 用户输入数字
 */
static int user_input() {
    int inputValue = 0;
    printf("\n请输入一个数字");
    scanf("%d", &inputValue);
    return inputValue;
}
/**
 * 使用calloc分配内存
 * @param length 内存长度(int)
 * @return
 */
static int* arr(int length) {
    int *pInt = (int *) calloc(length, sizeof(int));
    return pInt;
}
/**
 * 打印int数组的内容
 * @param length 数组长度
 * @param arr    数组首地址
 */
static void print_arr(unsigned int length, int *arr) {
    for (int i = 0; i < length; ++i) {
        int i1 = arr[i];
        printf("\n%d:%d", i, i1);
    }
}
/**
 * 用户填充数组
 * @param arr    数组首地址
 * @param length 数组长度
 */
static void user_fill_arr(int *arr, int length) {
    for (int i = 0; i < length; ++i) {
        printf("\n请输入填充一个数字");
        scanf("%d", arr + i);
    }
}
/**
 * 测试calloc
 */
void test_calloc(void) {
    int i = user_input();
    int *pInt = arr(i);
    user_fill_arr(pInt, i);
    print_arr(i, pInt);
}
/**
 * 测试realloc
 */
void test_realloc(void) {
    int i = user_input();
    int *pInt = arr(i);
    user_fill_arr(pInt, i);
    print_arr(i, pInt);
    printf("\n重新分配空间, 请输入新的长度");
    scanf("%d", &i);
    int *pInt1 = (int *) realloc(pInt, i * sizeof(int));
    printf("\n打印新分配的内存值");
    print_arr(i, pInt1);
    user_fill_arr(pInt1, i);
    print_arr(i, pInt1);
}